package com.cloud.class04.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    public static void main(String[] args) {
        // 创建一个具有5个许可的Semaphore
        Semaphore semaphore = new Semaphore(5);

        // 创建一个固定大小的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        // 向线程池中提交10个任务
        for (int i = 0; i < 10; i++) {
            executorService.submit(new Task(semaphore));
        }

        // 关闭线程池
        executorService.shutdown();
    }

    static class Task implements Runnable {
        private Semaphore semaphore;

        public Task(Semaphore semaphore) {
            this.semaphore = semaphore;
        }

        @Override
        public void run() {
            try {
                // 获取许可
                semaphore.acquire();
                System.out.println("线程 " + Thread.currentThread().getName() + " 获取到一张票");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 释放许可
                semaphore.release();
                System.out.println("线程 " + Thread.currentThread().getName() + " 释放一张票");
            }
        }
    }
}


//这段代码会终止是因为在主函数中，创建了一个固定大小为10的线程池，并向线程池中提交了10个任务。每个任务都会尝试获取Semaphore的许可，由于Semaphore只有5个许可，所以每次只能有5个任务同时执行。当一个任务完成后，它会释放许可，这样其他等待的任务就可以获取许可并开始执行。
//
//在这段代码中，线程池的大小为10，而Semaphore的许可数量为5，所以最多只能有5个任务同时执行。当所有任务都执行完毕后，线程池会自动关闭，因此程序会终止。